package main

import "fmt"

func main() {
	// 使用make()函数创建切片  开辟内存空间
	// s1 := make([]int, 5, 10)
	// fmt.Printf("s1=%v len(s1)=%d cap(s1)=%d\n", s1, len(s1), cap(s1)) // 默认0值
	// s2 := make([]int, 0, 10)
	// fmt.Printf("s1=%v len(s2)=%d cap(s2)=%d\n", s2, len(s2), cap(s2)) // 默认0值

	// 切片的本质就是一个框， 框住了一个连续内存。属于引用类型， 真正的数据都是保存在底层的数组里的。

	// 切片之间是不能比较的，我们不能使用==操作符来判断两个切片是否含有全部相等元素。
	// 切片唯一合法的比较操作是和nil比较。一个nil值的切片并没有底层数据，一个nil
	// 值的切片长度和容量都是0.但是我们不能说一个长度和容量都是0的切片就一定是nil
	// 例如下面的示例
	// var s1 []int         // len(s1)=0;cap(s1)=0; s1 == nil
	// s2 := []int{}        // 开辟内存空间 // len(s2)=0;cap(s2)=0; s2 != nil
	// s3 := make([]int, 0) // len(s3)=0;cap(s3)=0; s3 != nil
	// fmt.Printf("len(s1):%d cap(s1):%d ; %d", len(s1), cap(s1), s1)
	// fmt.Printf("len(s2):%d cap(s2):%d ; %d", len(s2), cap(s2), s2)
	// fmt.Printf("len(s3):%d cap(s3):%d ; %d", len(s3), cap(s3), s3)
	// 所以判断一个切片是否为空，要用len(s) == 0 来判断 不应该使用 s == nil 来判断

	// 切片的赋值拷贝
	s4 := []int{1, 3, 5}
	s5 := s4 // s3 和 s4 都指向了同一个底层数组
	fmt.Println(s4, s5)
	s4[0] = 1000
	fmt.Println(s4, s5)

	// 切片的遍历
	// 1.索引遍历
	for i := 0; i < len(s4); i++ {
		fmt.Println(s4[i])
	}
	// 2. for range循环
	for i, v := range s4 {
		fmt.Println(i, v)
	}
	// fmt.Printf('\n')

}
